package codificadorBinario;

import gen.Marca;
import gen.Nacionalidad;

import java.util.EnumMap;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import poblacion.Individuo;

public class CodificadorDeIndividuos {
	
	private static Map<Integer, String> numeros;
	private static Map<Nacionalidad, String> nacionalidades;
	private static Map<Integer, String> posiciones;
	private static Map<Marca, String> marcas;
	
	static{
	
		numeros = new HashMap<Integer, String>();
		numeros.put(Integer.valueOf(1), "000");
		numeros.put(Integer.valueOf(2), "001");
		numeros.put(Integer.valueOf(3), "010");
		numeros.put(Integer.valueOf(4), "011");
		numeros.put(Integer.valueOf(5), "100");
		numeros.put(Integer.valueOf(6), "101");
		numeros.put(Integer.valueOf(0), "111");  //INDEFINIDO
		
		nacionalidades = new EnumMap<Nacionalidad, String>(Nacionalidad.class);
		nacionalidades.put(Nacionalidad.ALEMAN, "000");
		nacionalidades.put(Nacionalidad.BELGA, "001");
		nacionalidades.put(Nacionalidad.ESPANIOL, "010");
		nacionalidades.put(Nacionalidad.FRANCES, "011");
		nacionalidades.put(Nacionalidad.FRANCES, "100");
		nacionalidades.put(Nacionalidad.ITALIANO, "101");
		nacionalidades.put(Nacionalidad.INDEFINIDA, "111"); 
		
		posiciones = new HashMap<Integer, String>();
		posiciones.put(Integer.valueOf(1), "000");
		posiciones.put(Integer.valueOf(2), "001");
		posiciones.put(Integer.valueOf(3), "010");
		posiciones.put(Integer.valueOf(4), "011");
		posiciones.put(Integer.valueOf(5), "100");
		posiciones.put(Integer.valueOf(6), "101");
		posiciones.put(Integer.valueOf(0), "111"); //indefinido

		
		marcas = new EnumMap<Marca, String>(Marca.class);
		marcas.put(Marca.BANESTO, "00");
		marcas.put(Marca.CLAS, "01");
		marcas.put(Marca.FESTINA, "10");
		marcas.put(Marca.INDEFINIDA, "11");
	}
	
	
	
	public static String individuoBits(Individuo individuo){
		
		StringBuilder builder = new StringBuilder();

		builder.append(numeros.get(individuo.getNumero()));
		builder.append(nacionalidades.get(individuo.getNacionalidad()));
		builder.append(posiciones.get(individuo.getPosicion()));
		builder.append(marcas.get(individuo.getMarca()));

		return builder.toString();

	}
	/*
	 * retorna null si es una combinacion invalida de bits
	 */
	public static Individuo bitsIndividuo(String bits){
		Integer numero = null;
		Nacionalidad nacionalidad = null;
		Integer posicion = null;
		Marca marca=null;
		
		String numeroBinario = bits.substring(0, 3);
		String nacionalidadBinaria = bits.substring(3, 6);
		String posicionBinaria = bits.substring(6, 9);
		String marcaBinaria = bits.substring(9);
		
		for (Entry<Integer, String> entry : numeros.entrySet()) {
			if (entry.getValue().equals(numeroBinario)){
				numero=(entry.getKey());
			}
		}
		
		for (Entry<Nacionalidad, String> entry : nacionalidades.entrySet()) {
			if (entry.getValue().equals(nacionalidadBinaria)){
				nacionalidad = (entry.getKey());
			}
		}
		
		for (Entry<Integer, String> entry : posiciones.entrySet()) {
			if (entry.getValue().equals(posicionBinaria)){
				posicion = (entry.getKey());
			}
		}
		
		
		for (Entry<Marca, String> entry : marcas.entrySet()) {
			if (entry.getValue().equals(marcaBinaria)){
				marca = (entry.getKey());
			}
		}
		
		if (numero==null)
			numero=0;
		
		if (posicion==null)
			posicion=0;
		
		if (nacionalidad==null)
			nacionalidad=Nacionalidad.INDEFINIDA;
		
		if (marca==null)
			marca = Marca.INDEFINIDA;
	
		return new Individuo(numero, nacionalidad, posicion, marca);
	}
	
}
